package com.skyline.user.service;

import java.util.List;

import com.skyline.common.bean.Page;
import com.skyline.user.model.Fan;
import com.skyline.user.type.IdolType;

/**
 * 用户关注接口，用于操作关注和粉丝信息
 * 
 * @author wuqh
 *
 */
public interface FanService {

	/**
	 * follow 关注某人
	 * 
	 * @param idolId
	 *            被关注者
	 * @param idolNickname
	 * @param idolPortrait
	 * @param fanId
	 *            用户自己
	 * @param fanNickname
	 * @param fanPortrait
	 * @param idolType
	 *            被关注者的类型
	 */
	public void follow(Long idolId, String idolNickname, String idolPortrait, Long fanId, String fanNickname,
			String fanPortrait, IdolType idolType);

	/**
	 * 根据用户ID和关注的类型筛选用户的关注
	 * 
	 * @param fanId
	 * @param idolType
	 * @return
	 */
	public List<Fan> listIdols(Long fanId, IdolType idolType, Page page);

	/**
	 * 根据用户ID和关注的类型筛选用户的关注（全量）
	 * 
	 * @param fanId
	 * @param idolType
	 * @return
	 */
	public List<Fan> listIdols(Long fanId, IdolType idolType);

	/**
	 * 根据用户ID筛选粉丝
	 * 
	 * @param idolId
	 * @return
	 */
	public List<Fan> listFans(Long idolId, Page page);

	/**
	 * 取消关注
	 * 
	 * @param fanId
	 * @param idolId
	 */
	public void unFollow(Long idolId, Long fanId);

	/**
	 * 判断是不是关注关系
	 * 
	 * @param idolId
	 * @param fanId
	 * @return
	 */
	public boolean isFan(Long idolId, Long fanId);

	/**
	 * 判断是否相互关注
	 * 
	 * @param idolId
	 * @param fanId
	 * @return
	 */
	public boolean isFanEachOther(Long idolId, Long fanId);

	/**
	 * 计算粉丝数
	 * 
	 * @param idolId
	 * @return
	 */
	public int countFans(Long idolId);

	/**
	 * 根据类型计算关注个数
	 * 
	 * @param fanId
	 * @param idolType
	 * @return
	 */
	public int countIdols(Long fanId, IdolType idolType);
	
	/**
	 * 获取共同关注列表
	 * 
	 * @param ownerId 列表拥有者
	 * @param viewerId 查看者（通常为当前登录与用户）
	 * @param idolType
	 * @param page
	 * @return
	 */
	public List<Fan> listBothIdols(Long ownerId, Long viewerId, IdolType idolType, Page page);
	
	/**
	 * 获取关注列表，并且带有共同关注标识，以便前台显示关注按钮
	 * 
	 * @param ownerId
	 * @param viewerId
	 * @param idolType
	 * @param page
	 * @return
	 */
	public List<Fan> listIdolsWithFollowed(Long ownerId, Long viewerId, IdolType idolType, Page page);
	
	/**
	 * 获取粉丝列表，并且关注标识，以便前台显示关注按钮
	 * 
	 * @param idolId
	 * @param viewerId
	 * @param page
	 * @return
	 */
	public List<Fan> listFansWithFollowed(Long idolId, Long viewerId, Page page);
	
	/**
	 * 获取相互关注列表（只有本人才能查询）
	 * 
	 * @param fanId
	 * @param page
	 * @return
	 */
	public List<Fan> listEachOtherIdols(Long fanId, Page page);
}
